﻿@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>CallAndApply</title>
</head>
<body>
    <input type="text" id="idTxt" value="input text">
    <script type="text/javascript">
        //call和apply，它们的作用都是将函数绑定到另外一个对象上去运行
        //两者的格式和参数定义：
        //call( thisArg [，arg1，arg2，… ] );       // 参数列表，arg1，arg2，...
        //apply(thisArg [，argArray] );                 // 参数数组，argArray
        //上面两个函数内部的this指针，都会被赋值为thisArg，这可实现将函数作为另外一个对象的方法运行的目的
        var value = "global var";

        function mFunc() {
            this.value = "member var";
        }

        function gFunc() {
            alert(this.value);
        }

        window.gFunc();                                 // show gFunc, global var  
        gFunc.call(window);                             // show gFunc, global var  
        gFunc.call(new mFunc());                        // show mFunc, member var  
        gFunc.call(document.getElementById('idTxt'));   // show element, input text  
    </script>

    <script type="text/javascript">
        var func = new function () {
            this.a = "func";
        }

        var func2 = function (x) {
            var a = "func2";
            alert(this.a);
            alert(x);
        }

        func2.call(func, "func2");                      // show func and func2  
    </script>

    <script type="text/javascript">
        /*
        最后，分析结果
        1、全局对象window调用函数gFunc，this指向window对象，因此this.value为global var
        2、函数gFunc调用call方法，this默认指向第一个参数window对象，因此this.value也为global var
        3、函数gFunc调用call方法，this默认指向第一个参数new mFunc()，即mFunc的对象，因此this.value为mFunc的成员变量member var
        4、函数gFunc调用call方法，this默认指向第一个参数input text控件，即id=‘idTxt’的控件，因此this.value为input控件的value值input text
        5、函数func2调用call方法，this默认指向第一个参数func函数对象，因此this.value为this.a，即func
        6、函数func2调用call方法，第二个参数属于函数对象func2的参数，因此alert(x)为第二个参数func2
        */
    </script>
</body>
</html>
